package com.bifang.module.file.core.biz.impl;

import cn.hutool.core.convert.Convert;
import com.alicp.jetcache.Cache;
import com.alicp.jetcache.anno.CacheType;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.bifang.engine.assistant.core.enums.AuthStatusEnum;
import com.bifang.engine.assistant.core.enums.BoolEnum;
import com.bifang.engine.assistant.core.exception.AppException;
import com.bifang.engine.cache.jetcache.utils.JetCacheUtils;
import com.bifang.module.base.common.vo.application.ApplicationKeyVO;
import com.bifang.module.base.common.vo.application.ApplicationVO;
import com.bifang.module.base.core.integration.BaseIntegration;
import com.bifang.module.file.common.vo.FileClassVO;
import com.bifang.module.file.core.biz.FileClassIntegration;
import com.bifang.module.file.common.cache.FileCacheConst;
import com.bifang.module.file.common.vo.FileEnvVO;
import com.bifang.module.file.core.biz.FileEnvIntegration;
import com.bifang.module.file.dao.service.FileAppClassService;
import com.bifang.module.file.dao.service.FileClassService;
import com.bifang.module.file.dao.model.FileAppClass;
import com.bifang.module.file.dao.model.FileClass;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.Duration;

@Service
public class FileClassIntegrationImpl implements FileClassIntegration {
    @Autowired
    FileClassService fileClassService;
    @Autowired
    FileAppClassService fileAppClassService;
    @Autowired
    FileEnvIntegration fileEnvIntegration;
    @Autowired
    BaseIntegration baseIntegration;

    @Override
    public FileClassVO getFileClassDetail(String fileClassCode) {
        if (StringUtils.isBlank(fileClassCode)) {
            throw new AppException("文件分类编号不能为空");
        }
        FileClassVO fileClassVO;
        // 判断是否存在缓存中 在缓存中的，获取缓存数据
        Cache cache = JetCacheUtils.create(FileCacheConst.FILECLASSINFO, CacheType.BOTH, Duration.ofSeconds(86400),Duration.ofSeconds(300));
        if (cache.get(fileClassCode)!=null) {
            fileClassVO = (FileClassVO) cache.get(fileClassCode);
        } else {
            FileClass fileClass = fileClassService.getById(fileClassCode);
            if (fileClass == null) {
                throw new AppException("文件分类（" + fileClassCode + "）未配置");
            }
            if (fileClass.getFileEnvId() == null) {
                throw new AppException("文件服务的环境未配置");
            }

            Long fileEnvId = fileClass.getFileEnvId();
            FileEnvVO fileEnvVO = fileEnvIntegration.getFileEnvDetail(fileEnvId);
            fileClassVO = Convert.convert(FileClassVO.class, fileClass);
            BeanUtils.copyProperties(fileEnvVO, fileClassVO);
            cache.put(fileClassCode,fileClassVO);
        }
        return fileClassVO;
    }

    @Override
    public FileClassVO getFileClassDetail(String fileClassCode, Long appId) {
        if (StringUtils.isBlank(fileClassCode)) {
            throw new AppException("文件分类编号不能为空");
        }
        if (appId == null) {
            throw new AppException("应用id不能为空");
        }
        FileClassVO fileClassVO=new FileClassVO();
        FileClassVO fileClassInfo = this.getFileClassDetail(fileClassCode);
        String key = appId + ":" + fileClassCode;
        // 判断是否存在缓存中 在缓存中的，获取缓存数据
        Cache cache = JetCacheUtils.create(FileCacheConst.FILECLASSINFOAPPID, CacheType.BOTH, Duration.ofSeconds(86400),Duration.ofSeconds(300));
        if (cache.get(key)!=null) {
            fileClassVO = (FileClassVO) cache.get(key);
            fileClassVO.setStatus(fileClassInfo.getStatus());
        } else {
            BeanUtils.copyProperties(fileClassInfo,fileClassVO);

            QueryWrapper<FileAppClass> queryWrapper = new QueryWrapper<>();
            queryWrapper
                    .lambda()
                    .eq(FileAppClass::getAppId, appId)
                    .eq(FileAppClass::getAuthStatus, AuthStatusEnum.YES.getType())
                    .eq(FileAppClass::getFileClassCode, fileClassCode);
            FileAppClass fileAppClass = fileAppClassService.getOne(queryWrapper);
            if (fileAppClass != null) {
                if (StringUtils.isNotBlank(fileAppClass.getFileClassPath())) {
                    fileClassVO.setFileClassPath(fileAppClass.getFileClassPath());
                }
                if (fileAppClass.getExpireTime() != null) {
                    fileClassVO.setExpireTime(fileAppClass.getExpireTime().getTime());
                }
                fileClassVO.setAppHasScope(true);
            } else {
                ApplicationKeyVO applicationKeyVO=new ApplicationKeyVO();
                applicationKeyVO.setAppId(appId);
                ApplicationVO applicationVO=baseIntegration.getApplicationByAppId(applicationKeyVO);
                if (applicationVO==null){
                    throw new AppException("应用信息不存在");
                }
                if (BoolEnum.FALSE.getType().equalsIgnoreCase(applicationVO.getCheckScope())) {
                    fileClassVO.setAppHasScope(true);
                }else{
                    fileClassVO.setAppHasScope(false);
                }

            }

            cache.put(key, fileClassVO);
        }
        return fileClassVO;
    }
}
